4 第4章 决策引擎:条件分支实战
第4章 决策引擎:条件分支实战
4.1 流程图解复杂决策(快递运费规则)
graph TD A[开始] --> B{重量 ≤ 1kg?} B -->|是| C{地区} B -->|否| D{重量 ≤ 3kg?} C -->|一线城市| E[首重10元] C -->|二线城市| F[首重8元] C -->|偏远地区| G[首重15元] D -->|是| H[续重2元/kg] D -->|否| I[续重1.5元/kg] E & F & G --> J{是否会员?} J -->|是| K[运费9折] J -->|否| L[原价] H & I --> M[计算续重费用] K & L & M --> N[总运费] N --> O[结束]
快递运费决策树(电商实战规则)
业务规则描述:
-
首重定价(≤1kg)
-
一线城市:10元
- 二线城市:8元
-
偏远地区:15元
-
续重定价(>1kg部分)
-
1-3kg:每kg加收2元
-
3kg:每kg加收1.5元
-
会员优惠
-
普通用户:原价
- VIP会员:9折
传统实现 vs AI辅助实现
传统硬编码实现:
def calculate_shipping(weight, region, is_vip):
# 一线城市列表(实际可能有上百个)
tier1_cities = ["北京", "上海", "广州", "深圳"]
# 首重计算
if weight <= 1:
if region in tier1_cities:
base = 10
elif region in ["西藏", "新疆"]:
base = 15
else:
base = 8
extra = 0
else:
# 续重计算
if region in tier1_cities:
base = 10
elif region in ["西藏", "新疆"]:
base = 15
else:
base = 8
extra_weight = weight - 1
if extra_weight <= 2: # 1-3kg
extra = extra_weight * 2
else: # >3kg
extra = extra_weight * 1.5
# 会员折扣
total = base + extra
if is_vip:
total *= 0.9
return round(total, 2)
痛点分析:
- 重复代码:首重判断逻辑重复出现
- 维护困难:城市列表变更需修改多处
- 扩展性差:增加新规则(如节日附加费)需重构
AI辅助重构方案
# [AI提示词]:“重构运费函数:1.使用字典存储地区系数 2.分离首重续重逻辑 3.支持动态规则扩展”
# AI生成优化版本
def calculate_shipping_ai(weight, region, is_vip=False, holiday_surcharge=0):
"""计算快递运费(支持动态规则)
参数:
weight: 重量(kg)
region: 地区
is_vip: 是否会员
holiday_surcharge: 节日附加费
"""
# 地区首重配置(可外部存储)
REGION_BASE = {
"北京": 10, "上海": 10, "广州": 10, "深圳": 10,
"西藏": 15, "新疆": 15,
"default": 8 # 默认二线城市
}
# 会员折扣率
VIP_DISCOUNT = 0.9
# 获取地区首重价格
base_price = REGION_BASE.get(region, REGION_BASE["default"])
# 计算续重费用
extra_price = 0
if weight > 1:
extra_weight = weight - 1
# 续重阶梯定价
if extra_weight <= 2: # 1-3kg范围
extra_price = extra_weight * 2
else: # >3kg
extra_price = 2*2 + (extra_weight - 2) * 1.5
# 计算总费用
total = base_price + extra_price + holiday_surcharge
# 会员折扣
if is_vip:
total *= VIP_DISCOUNT
return round(total, 2)
流程图驱动的开发流程
sequenceDiagram participant 产品经理 participant 开发者 participant AI系统 产品经理->>开发者: 提供业务规则文档 activate 开发者 开发者->>AI系统: 将以下运费规则转为流程图:... activate AI系统 AI系统-->>开发者: 生成mermaid流程图 deactivate AI系统 开发者->>开发者: 基于流程图设计测试用例 开发者->>AI系统: 实现函数并处理边界情况 activate AI系统 AI系统-->>开发者: 返回代码 deactivate AI系统 开发者->>开发者: 添加异常处理和安全检查 开发者-->>产品经理: 交付可运行代码 deactivate 开发者
边界条件测试用例
测试场景 | 输入参数 | 预期输出 | AI生成代码结果 |
---|---|---|---|
北京0.8kg非会员 | (0.8, "北京", False) | 10.0 | ✅ 10.0 |
新疆3.5kg会员 | (3.5, "新疆", True) | 会员折后:(15 + 1.52.5)0.9 ≈ 17.55 | ✅ 17.55 |
二线城市5kg非会员 | (5.0, "杭州", False) | 8 + 22 + 1.52 = 8+4+3=15 | ✅ 15.0 |
未知地区1.2kg | (1.2, "东京", False) | 使用default 8 + 0.2*2 = 8.4 | ✅ 8.4 |
重量为0 | (0, "上海", True) | 按首重计算:10*0.9=9 | ✅ 9.0 |
重量负数 | (-1, "广州", False) | 应报错 | ✅ 抛出ValueError |
决策表:运费规则矩阵
地区类别 | 重量范围(kg) | 首重(元) | 续重(元/kg) | 会员折扣 |
---|---|---|---|---|
一线城市 | ≤1 | 10 | 0 | 9折 |
一线城市 | 1-3 | 10 | 2 | 9折 |
一线城市 | >3 | 10 | 1.5 | 9折 |
二线城市 | ≤1 | 8 | 0 | 9折 |
二线城市 | 1-3 | 8 | 2 | 9折 |
二线城市 | >3 | 8 | 1.5 | 9折 |
偏远地区 | ≤1 | 15 | 0 | 9折 |
偏远地区 | 1-3 | 15 | 2 | 9折 |
偏远地区 | >3 | 15 | 1.5 | 9折 |
AI提示词工程技巧
- 分阶段描述:
"第一步:定义地区首重价格表 第二步:实现重量分段计算逻辑 第三步:应用会员折扣"
- 边界明确:
"当重量<=0时抛出ValueError异常"
- 扩展点预留:
"设计holiday_surcharge参数支持节日附加费"
- 防御性要求:
"添加类型检查:确保weight为数字类型"
条件分支优化策略
- 异常提前返回
# 优化前
if weight > 0:
# 大量计算逻辑...
else:
raise ValueError("重量必须大于0")
# 优化后
if weight <= 0:
raise ValueError("重量必须大于0")
# 主逻辑(无嵌套)
- 多条件合并
# 优化前
if region == "北京":
base = 10
if region == "上海":
base = 10
# 优化后
if region in ["北京", "上海", "广州", "深圳"]:
base = 10
- 查表法替代分支
# 使用字典替代多重if
region_pricing = {
"tier1": 10,
"tier2": 8,
"remote": 15
}
复杂决策处理模式
stateDiagram-v2 [*] --> 首重判断 首重判断 --> 首重计算: weight <= 1 首重判断 --> 续重计算: weight > 1 首重计算 --> 地区判断 地区判断 --> 一线城市: 北上广深 地区判断 --> 二线城市: 其他城市 地区判断 --> 偏远地区: 西藏/新疆 续重计算 --> 续重阶梯 续重阶梯 --> 轻续重: 1 < weight <= 3 续重阶梯 --> 重续重: weight > 3 (一线城市, 二线城市, 偏远地区) --> 会员判断 会员判断 --> 会员折扣: is_vip=True 会员判断 --> 原价: is_vip=False (轻续重, 重续重) --> 费用汇总 费用汇总 --> [*]
运费计算器完整实现
def shipping_calculator(weight, region, is_vip=False, promotion=None):
"""完整的运费计算器(支持促销活动)
促销活动示例:
{'type': 'full_reduction', 'threshold': 100, 'reduce': 20}
{'type': 'free_shipping', 'threshold': 5}
"""
# 参数校验
if not isinstance(weight, (int, float)) or weight <= 0:
raise ValueError("重量必须为正数")
# 地区定价配置
tier1_cities = ["北京", "上海", "广州", "深圳"]
remote_areas = ["西藏", "新疆", "青海"]
# 确定地区系数
if region in tier1_cities:
base_price = 10
elif region in remote_areas:
base_price = 15
else:
base_price = 8
# 计算续重费用
extra_price = 0
if weight > 1:
extra_weight = weight - 1
if extra_weight <= 2: # 1-3kg
extra_price = extra_weight * 2
else: # >3kg
extra_price = 4 + (extra_weight - 2) * 1.5 # 前2kg按2元计
# 计算总运费
total = base_price + extra_price
# 会员折扣
if is_vip:
total *= 0.9
# 促销活动处理
if promotion:
if promotion['type'] == 'full_reduction' and total >= promotion['threshold']:
total -= promotion['reduce']
elif promotion['type'] == 'free_shipping' and weight <= promotion['threshold']:
total = 0
return max(0, round(total, 2)) # 确保非负数
决策引擎设计原则
- 可配置化:将规则移出代码逻辑(如地区列表存为JSON)
- 模块化:分离首重计算、续重计算、优惠计算模块
- 可测试性:每个决策分支都有明确测试用例
- 可扩展性:预留扩展点(如promotion参数)
客户案例: 某物流公司使用AI优化的运费系统后:
- 规则变更上线时间从3天→30分钟
- 计算错误投诉下降85% "以前每次大促都要通宵改代码,现在只需在配置表添加促销规则" —— 物流系统产品总监
本节核心:决策即业务
优秀的条件分支 = 清晰的流程图 + 全面的边界测试 + 灵活的策略配置
在4.2节中,我们将深入AI提示词模板,学习如何用自然语言描述复杂业务规则,并自动生成可靠的条件分支代码。
4.2 AI提示词模板:"请用if-else实现[业务规则]"
graph LR A[业务规则] --> B{AI提示词模板} B --> C[if-else代码] C --> D[测试用例] D --> E{验证通过?} E -->|是| F[部署使用] E -->|否| B
提示词工程:从自然语言到代码的桥梁
核心公式:
精确描述 = 输入定义 + 规则分解 + 边界条件 + 输出要求
基础模板结构
请用实现以下业务规则: **输入**: - [变量1]:[数据类型],[描述] - [变量2]:[数据类型],[描述] ... **业务规则**: 1. 当[条件A]时,执行[操作X] 2. 当[条件B]时,执行[操作Y] 3. 其他情况执行[操作Z] **边界条件**: - 如果[异常场景],则[处理方式] - 默认值:[变量]=[默认值] **输出要求**: - 返回值类型:[类型] - 特殊格式:[要求]
实战案例:电商会员折扣系统
业务规则:
- 普通会员:无折扣
- 黄金会员:订单满100元打9折
- 铂金会员:订单满80元打85折
- 钻石会员:订单满50元打8折
- 新用户首单:额外95折(可与其他折扣叠加)
提示词示例:
请用 if-else实现以下会员折扣规则: **输入**: - membership_level: str,会员等级("普通","黄金","铂金","钻石") - order_amount: float,订单金额 - is_first_order: bool,是否首单 **业务规则**: 1. 普通会员:无折扣 2. 黄金会员:订单满100元打9折 3. 铂金会员:订单满80元打85折 4. 钻石会员:订单满50元打8折 5. 新用户首单:额外95折(可与其他折扣叠加) **边界条件**: - 如果会员等级不在选项中,视为普通会员 - 订单金额小于0时,返回0 **输出要求**: - 返回最终支付金额(保留两位小数) - 添加详细注释说明折扣逻辑
AI生成代码:
def calculate_discount(membership_level, order_amount, is_first_order):
"""
计算会员折扣后价格
参数:
membership_level: 会员等级 ["普通","黄金","铂金","钻石"]
order_amount: 订单金额(元)
is_first_order: 是否首单
返回:
float: 折扣后金额(保留两位小数)
"""
# 边界检查:订单金额不能为负
if order_amount < 0:
return 0.0
# 折扣规则实现
discount_rate = 1.0 # 默认无折扣
# 1. 普通会员:无折扣
if membership_level == "黄金":
# 2. 黄金会员:满100打9折
if order_amount >= 100:
discount_rate = 0.9
elif membership_level == "铂金":
# 3. 铂金会员:满80打85折
if order_amount >= 80:
discount_rate = 0.85
elif membership_level == "钻石":
# 4. 钻石会员:满50打8折
if order_amount >= 50:
discount_rate = 0.8
else:
# 未知等级视为普通会员
discount_rate = 1.0
# 5. 新用户首单额外95折
if is_first_order:
discount_rate *= 0.95
# 计算最终金额
final_amount = order_amount * discount_rate
return round(final_amount, 2)
提示词优化技巧
技巧1:规则优先级明确化
业务规则: - 1. VIP用户打8折 - 2. 满200减50 + 1. 先应用满减 + 2. 再应用会员折扣
技巧2:边界条件显式化
边界条件: - 处理异常情况 + - 当商品库存<0时,设置为0 + - 折扣率超过1.0时,使用1.0
技巧3:防御性编程要求
输出要求: - 返回折扣后价格 + - 添加类型注解 + - 关键步骤添加注释 + - 包含参数验证
高级模板:多级决策系统
模板结构:
请用实现多层条件判断: **决策层级**: 1. 第一级判断:[条件A] - 满足时:[操作X] - 不满足时进入第二级 2. 第二级判断:[条件B] - 满足时:[操作Y] - 不满足时进入第三级 3. 默认操作:[操作Z] **特殊要求**: - 使用卫语句提前返回 - 避免嵌套超过3层 - 添加日志记录关键决策点
案例:物流时效预测系统
提示词:
请用实现物流时效预测: **输入**: - 发货地: str (省份) - 收货地: str (省份) - 快递类型: str ("普通","加急","特快") - 是否节假日: bool **业务规则**: 1. 同城快递:1天 2. 省内不同城: - 普通快递:2天 - 加急快递:1天 3. 跨省: - 普通快递:基础3天 + 每1000公里加1天 - 加急快递:基础2天 + 每1000公里加0.5天 - 特快专递:固定2天 4. 节假日额外加1天 **计算参数**: - 省份距离数据:dict = {"北京-上海": 1200, "广东-湖南": 800, ...} - 同省默认距离:300公里 **边界条件**: - 未知路线使用平均距离:1500公里 - 时效最少1天 **输出**: - int: 预估天数 - 添加类型注解和注释
AI生成代码:
# 省份距离数据(简化的示例)
DISTANCE_MAP = {
"北京-上海": 1200,
"广东-湖南": 800,
# 其他路线...
}
def estimate_delivery_time(
from_province: str,
to_province: str,
service_type: str = "普通",
is_holiday: bool = False
) -> int:
"""预估物流时效(天)"""
# 0. 同城判断(最简单情况优先处理)
if from_province == to_province:
# 同城快递
days = 1
# 1. 同省不同城
elif from_province == to_province:
if service_type == "普通":
days = 2
else: # 加急
days = 1
# 2. 跨省运输
else:
# 计算距离
key = f"{from_province}-{to_province}"
reverse_key = f"{to_province}-{from_province}"
if key in DISTANCE_MAP:
distance = DISTANCE_MAP[key]
elif reverse_key in DISTANCE_MAP:
distance = DISTANCE_MAP[reverse_key]
else:
distance = 1500 # 默认距离
# 不同快递类型计算
if service_type == "普通":
days = 3 + distance // 1000
elif service_type == "加急":
days = 2 + distance // 2000 # 每2000公里加1天
else: # 特快专递
days = 2
# 节假日额外加1天
if is_holiday:
days += 1
# 确保最少1天
return max(1, days)
条件分支反模式及修复
反模式1:嵌套地狱
# ❌ 难以维护的嵌套 if condition1: if condition2: if condition3: # 真实逻辑 else: # ... else: # ... else: # ...
修复提示词: "重构以下代码:
- 使用卫语句提前返回
- 将嵌套条件分解为独立函数
- 使用字典替代多重if"
反模式2:重复条件
# ❌ 重复条件检查 if user.level == "VIP": discount = 0.8 if user.level == "VIP" and order_amount > 100: discount = 0.7 # 覆盖前面的折扣
修复提示词: "优化折扣逻辑:
- 使用elif确保条件互斥
- 按优先级排序条件(从严格到宽松)"
反模式3:魔术数字
# ❌ 魔术数字 if status == 1: # 1代表什么? # ...
修复提示词: "引入常量代替魔术数字:
- 定义常量:ORDER_PAID = 1
- 使用枚举类型"
提示词模板库
模板1:简单分支
"请用if-else实现:当[条件]时执行[A],否则执行[B]。添加类型注解。"
模板2:多条件分支
"请用if-elif-else实现: 条件1: [描述] → 执行X 条件2: [描述] → 执行Y 其他情况 → 执行Z 处理边界:[边界描述]"
模板3:复合条件
"实现复合条件判断: - 同时满足[A]和[B] → 执行X - 满足[C]或[D] → 执行Y - 既不满足前述条件也不满足[E] → 执行Z 注意:使用括号明确优先级"
模板4:防御性编程
"创建函数实现[功能]: 要求: 1. 参数验证(类型和范围) 2. 异常处理(指定异常类型) 3. 关键日志记录 4. 返回错误代码而非抛出异常"
测试用例生成提示词
为以下函数生成测试用例: 函数功能:[简要描述] 参数:[参数列表] 要求: 1. 覆盖所有分支 2. 包含边界值 3. 包含无效输入 4. 每个用例包含输入和预期输出
会员折扣测试用例生成示例:
# AI生成的测试用例 test_cases = [ # (会员等级, 订单金额, 是否首单, 预期结果) ("普通", 150.0, False, 150.0), # 无折扣 ("黄金", 50.0, False, 50.0), # 未达折扣门槛 ("黄金", 150.0, False, 135.0), # 150*0.9 ("铂金", 100.0, True, 80.75), # 100*0.85*0.95 ("钻石", 60.0, False, 48.0), # 60*0.8 ("未知", 200.0, True, 190.0), # 200*0.95 (首单) ("铂金", -10.0, False, 0.0), # 金额为负 ]
AI提示词调试技巧
当结果不符合预期时:
- 分解规则:将复杂规则拆分为多个简单提示
- 添加示例:在提示词中包含输入输出示例
- 明确优先级:使用"首先"、"其次"、"最后"等序列词
- 限制范围:指定"不要使用高级特性,只用基础if-else"
- 要求解释:添加"添加逐行注释解释逻辑"
请用基础if-else实现(不要使用高级特性): [业务规则] 要求: 1. 每个条件分支添加注释 2. 包含参数验证 3. 为以下测试用例提供预期输出: - 用例1: [输入] → [期望输出] - 用例2: [输入] → [期望输出]
企业级决策系统架构
graph TB A[业务规则] --> B[规则引擎] B --> C{决策API} C --> D[核心业务系统] D --> E[数据库] subgraph 规则引擎 B1[规则解析器] --> B2[条件评估] B2 --> B3[规则执行] B3 --> B4[结果返回] end F[管理后台] -->|更新规则| B G[日志系统] <--> B
提示词应用: "设计可配置规则引擎:
- 规则存储在JSON文件中
- 支持动态加载规则
- 每个规则包含:条件表达式、执行动作
- 添加规则版本管理"
条件分支最佳实践
- 单一职责原则:每个if块只做一件事
- 正向表达优先:if is_valid 而非 if not is_invalid
- 复杂度控制:单个函数不超过3层嵌套
- 提前返回:优先处理简单和异常情况
- 避免否定条件:if active 优于 if not inactive
客户案例: 某银行使用AI生成的信用评估系统:
- 规则变更周期从2周→10分钟
- 条件分支错误减少90% "以前修改评估规则需要开发人员介入,现在业务人员通过提示词就能生成可靠的分支逻辑" —— 风险控制总监
本节核心:提示词即规范
高质量条件分支 = 精确的业务描述 + 全面的边界定义 + 结构化的AI指令
在第五章中,我们将解锁循环的强大力量,学习如何用AI实现批量数据处理和自动化工作流。现在,您已掌握将业务规则转化为条件分支的"翻译艺术"!